<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="generator" content="AsciiDoc 8.2.5" />
<style type="text/css">
/* Debug borders */
p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
/*
  border: 1px solid red;
*/
}

body {
  margin: 1em 5% 1em 5%;
}

a {
  color: blue;
  text-decoration: underline;
}
a:visited {
  color: fuchsia;
}

em {
  font-style: italic;
}

strong {
  font-weight: bold;
}

tt {
  color: navy;
}

h1, h2, h3, h4, h5, h6 {
  /*color: #527bbd;*/
  color: #009900;
  font-family: sans-serif;
  margin-top: 1.2em;
  margin-bottom: 0.5em;
  line-height: 1.3;
}

h1, h2, h3 {
  border-bottom: 2px solid silver;
}
h2 {
  padding-top: 0.5em;
}
h3 {
  float: left;
}
h3 + * {
  clear: left;
}

div.sectionbody {
  font-family: serif;
  margin-left: 0;
}

hr {
  border: 1px solid silver;
}

p {
  margin-top: 0.5em;
  margin-bottom: 0.5em;
}

pre {
  padding: 0;
  margin: 0;
}

span#author {
  color: #527bbd;
  font-family: sans-serif;
  font-weight: bold;
  font-size: 1.1em;
}
span#email {
}
span#revision {
  font-family: sans-serif;
}

div#footer {
  font-family: sans-serif;
  font-size: small;
  border-top: 2px solid silver;
  padding-top: 0.5em;
  margin-top: 4.0em;
}
div#footer-text {
  float: left;
  padding-bottom: 0.5em;
}
div#footer-badges {
  float: right;
  padding-bottom: 0.5em;
}

div#preamble,
div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
  margin-right: 10%;
  margin-top: 1.5em;
  margin-bottom: 1.5em;
}
div.admonitionblock {
  margin-top: 2.5em;
  margin-bottom: 2.5em;
}

div.content { /* Block element content. */
  padding: 0;
}

/* Block element titles. */
div.title, caption.title {
  font-family: sans-serif;
  font-weight: bold;
  text-align: left;
  margin-top: 1.0em;
  margin-bottom: 0.5em;
}
div.title + * {
  margin-top: 0;
}

td div.title:first-child {
  margin-top: 0.0em;
}
div.content div.title:first-child {
  margin-top: 0.0em;
}
div.content + div.title {
  margin-top: 0.0em;
}

div.sidebarblock > div.content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}

div.listingblock {
  margin-right: 0%;
}
div.listingblock > div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock > div.content {
  padding-left: 2.0em;
}

div.attribution {
  text-align: right;
}
div.verseblock + div.attribution {
  text-align: left;
}

div.admonitionblock .icon {
  vertical-align: top;
  font-size: 1.1em;
  font-weight: bold;
  text-decoration: underline;
  color: #527bbd;
  padding-right: 0.5em;
}
div.admonitionblock td.content {
  padding-left: 0.5em;
  border-left: 2px solid silver;
}

div.exampleblock > div.content {
  border-left: 2px solid silver;
  padding: 0.5em;
}

div.verseblock div.content {
  white-space: pre;
}

div.imageblock div.content { padding-left: 0; }
div.imageblock img { border: 1px solid silver; }
span.image img { border-style: none; }

dl {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
dt {
  margin-top: 0.5em;
  margin-bottom: 0;
  font-style: italic;
}
dd > *:first-child {
  margin-top: 0;
}

ul, ol {
    list-style-position: outside;
}
div.olist2 ol {
  list-style-type: lower-alpha;
}

div.tableblock > table {
  border: 3px solid #527bbd;
}
thead {
  font-family: sans-serif;
  font-weight: bold;
}
tfoot {
  font-weight: bold;
}

div.hlist {
  margin-top: 0.8em;
  margin-bottom: 0.8em;
}
div.hlist td {
  padding-bottom: 5px;
}
td.hlist1 {
  vertical-align: top;
  font-style: italic;
  padding-right: 0.8em;
}
td.hlist2 {
  vertical-align: top;
}

@media print {
  div#footer-badges { display: none; }
}

div#toctitle {
  color: #527bbd;
  font-family: sans-serif;
  font-size: 1.1em;
  font-weight: bold;
  margin-top: 1.0em;
  margin-bottom: 0.1em;
}

div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
  margin-top: 0;
  margin-bottom: 0;
}
div.toclevel2 {
  margin-left: 2em;
  font-size: 0.9em;
}
div.toclevel3 {
  margin-left: 4em;
  font-size: 0.9em;
}
div.toclevel4 {
  margin-left: 6em;
  font-size: 0.9em;
}
/* Workarounds for IE6's broken and incomplete CSS2. */

div.sidebar-content {
  background: #ffffee;
  border: 1px solid silver;
  padding: 0.5em;
}
div.sidebar-title, div.image-title {
  font-family: sans-serif;
  font-weight: bold;
  margin-top: 0.0em;
  margin-bottom: 0.5em;
}

div.listingblock div.content {
  border: 1px solid silver;
  background: #f4f4f4;
  padding: 0.5em;
}

div.quoteblock-content {
  padding-left: 2.0em;
}

div.exampleblock-content {
  border-left: 2px solid silver;
  padding-left: 0.5em;
}

/* IE6 sets dynamically generated links as visited. */
div#toc a:visited { color: blue; }
</style>
<title></title>
</head>
<body>
<div id="header">
</div>
<div class="para"><p><center> <span class="image">
<img src="logo.png" alt="logo.png" />
</span> </center></p></div>
<div class="para"><p><br /></p></div>
<div class="para"><p><center> <strong>Auteurs:</strong> </center>
<center> <em>Nicolas Auberval</em> </center>
<center>   <em>Nicolas Clairon</em> </center>
<center>   <em>Sorel Diser</em> </center></p></div>
<div class="para"><p><br /></p></div>
<div class="para"><p>Dans le cadre d'un TER de fin d'étude (Master 2 Informatique), nous avons
développé un projet permettant d'aider les biologistes à manipuler des
collections d'arbres phylogénétiques. Cette application ce nomme <em>PhyloExplorer</em>.</p></div>
<div class="para"><p>Vous trouverez dans ce rapport :</p></div>
<div class="ilist"><ul>
<li>
<p>
une présentation du contexte du projet : présentation de la phylogénie et de
  la taxonomie, explication de l'intérêt du NCBI,
</p>
</li>
<li>
<p>
une documentation technique destinée aux développeurs et présentant la
  structure interne du projet,
</p>
</li>
<li>
<p>
un manuel d'installation à destination des administrateurs système,
</p>
</li>
<li>
<p>
un guide d'utilisation du projet PhyloExplorer. Ce guide est destiné aux
  biologistes et utilisateurs finaux,
</p>
</li>
<li>
<p>
un bilan de ce qui a été réalisé et des discussions concernant les
  évolutions du projet.
</p>
</li>
</ul></div>
<div class="sidebarblock">
<div class="sidebar-content">
<div class="sidebar-title">Sommaire</div>
<div class="para"><p><strong>Partie 1 : Présentation du projet</strong></p></div>
<div class="para"><p>  1. Phylogénie et Taxonomie</p></div>
<div class="para"><p>  1.1. Comprendre le sujet</p></div>
<div class="para"><p>  2. Analyse de l'existant</p></div>
<div class="para"><p>  3. Besoins et objectifs</p></div>
<div class="para"><p>  3.1. Besoins</p></div>
<div class="para"><p>  3.2. Objectifs</p></div>
<div class="para"><p>  3.3. Exigences</p></div>
<div class="para"><p><strong>Partie 2 : Documentation technique</strong></p></div>
<div class="para"><p>  1. Formats des fichiers</p></div>
<div class="para"><p>  2. Choix techniques</p></div>
<div class="para"><p>  3. Structure du projet</p></div>
<div class="para"><p>  3.1. PhyloCore</p></div>
<div class="para"><p>  3.2. PhyloWeb</p></div>
<div class="para"><p>  4. Sécurité</p></div>
<div class="para"><p>  5. Evolutions futures</p></div>
<div class="para"><p><strong>Partie 3 : Guide d'installation</strong></p></div>
<div class="para"><p>  1. Prérequis</p></div>
<div class="para"><p>  2. Installation</p></div>
<div class="para"><p>  2.1. Installation des dépendances</p></div>
<div class="para"><p>  2.2. Installation de PhyloExplorer</p></div>
<div class="para"><p>  3. Configuration</p></div>
<div class="para"><p><strong>Partie 4 : Guide de l'utilisateur</strong></p></div>
<div class="para"><p>  1. Etape 1: Chargement de données</p></div>
<div class="para"><p>  2. Etape 2: Arrivée sur la page "statistics"</p></div>
<div class="para"><p>  2.1. Résumé</p></div>
<div class="para"><p>  2.2. Interaction</p></div>
<div class="para"><p>  2.3. Histogrammes de statistiques</p></div>
<div class="para"><p>  2.4. Arborescence NCBI</p></div>
<div class="para"><p>  2.5. Les requêtes</p></div>
<div class="para"><p>  2.6. Téléchargement</p></div>
<div class="para"><p>  3. Etape 3: Naviguer dans la collection</p></div>
<div class="para"><p>  4. Module phyloWidget</p></div>
<div class="para"><p>  4.1. Qu'est ce que c'est?</p></div>
<div class="para"><p>  4.2. Intégration du module</p></div>
<div class="para"><p><strong>Partie 5 : Bilan</strong></p></div>
<div class="para"><p>  1. Résultats</p></div>
<div class="para"><p>  2. Valeur ajoutée</p></div>
<div class="para"><p><strong>Annexe</strong></p></div>
<div class="para"><p>  1. Glossaire phylogénétique</p></div>
<div class="para"><p>  2. Glossaire technique</p></div>
<div class="para"><p>  3. Liens externes</p></div>
</div></div>
<h1 id="_pr_sentation_du_projet">Présentation du projet</h1>
<h2 id="_phylog_nie_et_taxonomie">1. Phylogénie et Taxonomie</h2>
<div class="sectionbody">
<h3 id="_comprendre_le_sujet">1.1. Comprendre le sujet</h3><div style="clear:left"></div>
<div class="para"><p>La phylogénie est l'étude de la formation et de l'évolution des organismes du vivant en vue d'établir leur parenté. Elle formalise la classification sous forme d'arbres phylogénétiques (équivalent à un arbre généalogique depuis une racine incluant tous les êtres vivants existants ou ayant existé, jusqu'aux individus) dont les noeuds sont appelés <em>taxons</em>. Ainsi, la taxomanie associée définit l'étude et le regroupement de ces organismes en entité (familles, genres, espèces, &#8230;) selon leurs critères, caractères et autres similitudes.</p></div>
<div class="listingblock">
<div class="title">Exemple d'un arbre phylogénétique</div>
<div class="content">
<pre><tt>Root
|
+- Canidae
| +- Canis
| |     +- Canis lupus
| +- Vulpes
| +- Lycaon</tt></pre>
</div></div>
<div class="para"><p>Canis lupus, le loup, est un taxon de rang <em>espèce</em>.
Canis est le taxon immédiatement supérieur de rang <em>genre</em> et regroupe plusieurs espèces <em>chien, loup, chacal, &#8230;</em>
Canidae est le taxon immédiatement supérieur de rang <em>famille</em> et regroupe plusieurs genres <em>Canis (chien, loup, chacal), Vulpes (renard), Lycaon (lycaon), &#8230;</em></p></div>
<div class="para"><p>L'approche phylogénétique actuelle fait appel aux données de la cladistique, mais ses exigences se résument à n'accepter que des taxons monophylétiques, c'est-à-dire correspondant à un clade donné. Elle demande que les taxons soient limités à ceux qui respectent les deux conditions suivantes :</p></div>
<div class="ilist"><ul>
<li>
<p>
tous les individus du taxon descendent d'un individu ancestral particulier,
</p>
</li>
<li>
<p>
tous les descendants de cet ancêtre particulier sont dans le taxon.
</p>
</li>
</ul></div>
<div class="para"><p>On parle alors seulement de <em>taxon monophylétique</em> ou <em>clade</em>. Cette contrainte a amené des modifications fondamentales de la classification scientifique. Ainsi les dinosaures n'ont pas disparu, la systématique moderne inclut les oiseaux dans le groupement « dinosaures ».</p></div>
<div class="para"><p>Par ailleurs, d'importants progrès en génomique ont été faits grâce à l'analyse génétique automatique et le développement des outils/modèles informatiques. Ils imposent et permettent la redéfinition de certaines espèces ou groupes d'espèces. Ces changements nécessitent donc une meilleure connaissance et suivi des espèces, d'où l'évolution de la phylogénie.</p></div>
</div>
<h2 id="_analyse_de_l_existant">2. Analyse de l'existant</h2>
<div class="sectionbody">
<div class="para"><p>Le NCBI <em>National Center for Biotechnology Information</em> est un centre d'informations sur les biotechnologies établi en 1988. Le site du NCBI propose un ensemble d'outils et de bases de données sur la biologie, voir <a href="http://www.ncbi.nlm.nih.gov/sites/entrez?db=taxonomy"><tt>http://www.ncbi.nlm.nih.gov/sites/entrez?db=taxonomy</tt></a>. Il est considéré comme une référence pour la recherche en phylogénie et en ce qui nous concerne, on retiendra la partie <em>taxonomy</em> du site comme référence de départ pour le projet PhyloExplorer.</p></div>
<div class="para"><p>Dans un premier temps, on utilisera la base de données taxonomique à disposition du public pour créer notre structure conforme à la phylogénie en vigueur. Dans un second temps, les fonctionnalités de bases seront calquées sur la gestion d'arbres phylogénétiques en ligne. Et enfin, le site permettra de valider les résultats obtenus lors du développement de notre projet.</p></div>
<div class="para"><p>Comme tout site de recherche, le NCBI propose beaucoup d'informations via une interface chargée et peu adaptée au travail personnalisé.
La navigation sur un arbre apparaît assez fastidieuse et les informations taxonomiques, certes complètes, deviennent vite illisibles. En conclusion, l'ergonomie ne sera pas retenue et une interface mieux adaptée devra être mise en place pour faciliter une interaction plus soutenue avec l'utilisateur.</p></div>
</div>
<h2 id="_besoins_et_objectifs">3. Besoins et objectifs</h2>
<div class="sectionbody">
<h3 id="_besoins">3.1. Besoins</h3><div style="clear:left"></div>
<div class="para"><p>En perpétuel remaniement grâce/à cause de l'avancée des nouvelles techniques moléculaires et génétiques, les chercheurs ont besoin d'outils concis pour : la visualisation, l'analyse, la modification, la confrontation et le partage d'informations.</p></div>
<h3 id="_objectifs">3.2. Objectifs</h3><div style="clear:left"></div>
<div class="para"><p>L'objectif principal de ce projet est de pouvoir travailler sur sa propre collection d'arbres et d'appliquer les fonctionnalités suivantes :</p></div>
<div class="ilist"><ul>
<li>
<p>
parcourir et visualiser une collection d'arbres,
</p>
</li>
<li>
<p>
vérifier la conformité des structures d'arbres et la validité des taxons,
</p>
</li>
<li>
<p>
effectuer des requêtes sur une collection (tri sur le nombre et/ou la présence de taxons),
</p>
</li>
<li>
<p>
filtrer une collection (ne garder que les sous-arbres pertinents),
</p>
</li>
<li>
<p>
produire des statistiques (distribution des taxons et arbres dans une collection).
</p>
</li>
</ul></div>
<h3 id="_exigences">3.3. Exigences</h3><div style="clear:left"></div>
<div class="para"><p>Les seules exigences interviennent au niveau des formats d'entrée et sortie du projet. Ces derniers prennent en compte une collection d'arbres. On cite <strong>phylip</strong>, <strong>newick</strong>, <strong>nexus</strong> sous forme de <em>fichier.nwk</em>, et la banque de données stockée dans un <em>fichier.csv</em>.</p></div>
</div>
<h1 id="_documentation_technique">Documentation technique</h1>
<h2 id="_formats_des_fichiers">1. Formats des fichiers</h2>
<div class="sectionbody">
<div class="listingblock">
<div class="title">Exemple : Le format de données et de structure d'arbres phylogénétiques <em>Phylip/Newick</em></div>
<div class="content">
<pre><tt>((homo, rattus), bos ,(pan,mus));</tt></pre>
</div></div>
<div class="para"><p>L'arbre est défini entre parenthèses comme suit <strong>(arbre);</strong> ainsi que chaque groupe de taxons <strong>(frère 1, frère 2);</strong>.
On retrouve aussi les niveaux de profondeur de la façon suivante <strong>(1,(2,(3,3)));</strong>.
Si l'on applique à l'exemple précédent, on a 3 frères qui sont <em>(homo, rattus)</em>, <em>bos</em> et <em>(pan,mus)</em>, et 2 niveaux de profondeur.</p></div>
<div class="listingblock">
<div class="title">Exemple : Le format de fichier <em>Nexus</em> pour les collections d'arbres</div>
<div class="content">
<pre><tt>#nexus
begin trees;
Tree 1 = ((homo, rattus), bos ,(pan,mus));
Tree 2 = (pan,mus);
Tree 3 = ((homo,rats),pan);
Tree 4 = (((((homo,pan),macaca),ratus),dasypus),monodelphi);
end;</tt></pre>
</div></div>
<div class="para"><p>Le format nexus permet de structurer une collection d'arbres de façon explicite. Il supporte l'ajout d'annotations sous forme de commentaires.</p></div>
<div class="listingblock">
<div class="title">Exemple : données de la base <em>names.dump</em> du NCBI</div>
<div class="content">
<pre><tt>    id  |   nom taxon   |               |           type        |

9611    |   Canis       |               |   scientific name     |
9612    |   Canis lupus |               |   scientific name     |
9612    |   gray wolf   |               |   genbank common name |
9614    |   coyote      |               |   genbank common name |
9615    |   Canis canis |               |   synonym             |</tt></pre>
</div></div>
<div class="para"><p>Il s'agit d'une nomenclature communément utilisée. L'identifiant permet de retrouver de façon unique un taxon et trouver toutes les informations associées à l'aide de séparateurs définis.</p></div>
</div>
<h2 id="_choix_techniques">2. Choix techniques</h2>
<div class="sectionbody">
<div class="vlist"><dl>
<dt>
Langage de programmation
</dt>
<dd>
<p>
Tout le projet PhyloExplorer repose sur le langage <strong>Python</strong>. Ce langage a été
choisi pour sa licence (libre), sa portabilité (il est multiplateforme), sa robustesse,
et sa syntaxe simple et claire. La facilité avec laquel il manipule les
chaines de caractères a fait pencher la balance en sa faveur. Enfin, une
bibliothèque python sur le traitement d'arbres phylogénétiques avait déjà été
créée par l'un des auteurs : la base était déjà faite.
</p>
</dd>
<dt>
Serveur Web
</dt>
<dd>
<p>
Apache a été envisagé mais nous voulions un serveur web simple et autonome ; or
le <em>mod_python</em> d'apache n'est pas trivial à installer et à configurer. Nous nous
sommes donc tournés vers <strong>CherryPy</strong> qui est un "<em>framework HTTP orienté
objet</em>". Ainsi, l'installation était grandement facilitée et une utilisation
"standalone" pouvait être envisagée.
</p>
</dd>
<dt>
La gestion de graphes
</dt>
<dd>
<p>
Notre but étant de créer l'aborescence du NCBI à partir d'une liste de taxons,
il nous fallait une bibliothèque de gestion de graphes. Nous utilisons pour
cela <strong>NetworkX</strong>. Entièrement écrite en python, cette bibliothèque
multiplateforme s'installe très facilement et est relativement puissante.
</p>
</dd>
<dt>
Moteur de templates
</dt>
<dd>
<p>
Le moteur de templates a été attribué à <strong>Pleet</strong>. Une bibliothèque python
écrite par l'un des auteurs permettant d'embarquer du code python dans du
HTML. Cette bibliothèque est très simple, rapide et fait bien son travail.
</p>
</dd>
<dt>
Gestionnaire de projet
</dt>
<dd>
<p>
Nous avons utilisé <strong>Google Code</strong>. Ce gestionnaire de projet permet de gérer très
simplement des petits projets en mettant à disposition un système de wiki, un
gestionnaire de bugs et un gestionnaire de version (subversion).
</p>
</dd>
</dl></div>
</div>
<h2 id="_structure_du_projet">3. Structure du projet</h2>
<div class="sectionbody">
<div class="para"><p>Nous n'avons pas voulu enfermer PhyloExplorer dans une utilisation
particulière (ici le service web). C'est pourquoi PhyloExplorer est structuré
en plusieurs parties :</p></div>
<div class="ilist"><ul>
<li>
<p>
<strong>PhyloCore</strong> : une batterie de classes et de méthodes qui manipulent les
  collections d'arbres phylogénétiques et dialoguent avec la base de données du
  NCBI.
</p>
</li>
<li>
<p>
<strong>PhyloWeb</strong> : comprenant un serveur web légé et autonome ainsi qu'un
  ensemble de templates.
</p>
</li>
</ul></div>
<div class="para"><p>Cette distinction dans la structure permet aux développeurs de créer d'autres
applications en se servant de la même base (PhyloCore). Des scripts, pipelines ou encore
des applications QT peuvent être créés à moindre coût.</p></div>
<h3 id="_phylocore">3.1. PhyloCore</h3><div style="clear:left"></div>
<div class="para"><p>PhyloCore regroupe trois classes (<em>TaxanomyReference</em>, <em>TreeCollection</em> et
<em>PhylogeneticTree</em>) et une bibliothèque de gestion d'arbres phylogénétiques :
<em>Phylogelib</em>.</p></div>
<div class="para"><div class="title">Diagramme de classes</div><p><center> <span class="image">
<img src="phylo1.png" alt="phylo1.png" />
</span> </center></p></div>
<h4 id="_phylogelib">3.1.1. Phylogelib</h4>
<div class="para"><p>Phylogelib est une bibliothèque python qui permet de manipuler des arbres
phylogénétiques. Très rapide, elle se contente de traiter des chaines de
caractères au format newick (on évite ainsi la lourde gestion de graphes).</p></div>
<div class="sidebarblock">
<div class="sidebar-content">
<div class="sidebar-title">Fonctions principales utilisées dans PhyloExplorer</div>
<div class="vlist"><dl>
<dt>
checkNwk(nwk)
</dt>
<dd>
<p>
Renvoie vrai si la chaine passée en paramètre est au format newick.
</p>
</dd>
<dt>
getBrothers(tree, node)
</dt>
<dd>
<p>
Retourne la liste des frères du noeud.
</p>
</dd>
<dt>
getChildren(tree)
</dt>
<dd>
<p>
Retroune la liste des premiers fils de l'arbre.
</p>
</dd>
<dt>
getTaxa(tree)
</dt>
<dd>
<p>
Renvoie la liste de tous les taxons de l'arbre.
</p>
</dd>
<dt>
removeBootStraps(tree)
</dt>
<dd>
<p>
Supprime les "bootstraps" de l'arbre
</p>
</dd>
<dt>
removeNexusComments(nex)
</dt>
<dd>
<p>
Supprime les commentaires d'une collection au format nexus
</p>
</dd>
<dt>
tidyNwk(nwk)
</dt>
<dd>
<p>
Nettoie la chaine au format newick en supprimant tous les espaces superflux.
</p>
</dd>
</dl></div>
</div></div>
<h4 id="_l_outil_preproc_py">3.1.2. L'outil preproc.py</h4>
<div class="para"><p>PhyloExplorer utilise la base de données du NCBI comme base d'information.
Cette base de données est accessible à l'adresse :
<a href="ftp://ftp.ncbi.nih.gov/pub/taxonomy/taxdump.tar.gz"><tt>ftp://ftp.ncbi.nih.gov/pub/taxonomy/taxdump.tar.gz</tt></a>. Cette archive
comprend plusieurs images de la base du NCBI. Celles qui nous intéressent sont
<tt>names.dump</tt> et <tt>nodes.dump</tt>. Ces images nous permettent de récupérer :</p></div>
<div class="ilist"><ul>
<li>
<p>
l'id
</p>
</li>
<li>
<p>
le nom (scientifique)
</p>
</li>
<li>
<p>
le nom du parent
</p>
</li>
<li>
<p>
l'homonyme auquel il se rapporte
</p>
</li>
<li>
<p>
la liste de ses parents
</p>
</li>
<li>
<p>
la liste de ses synonymes
</p>
</li>
<li>
<p>
la liste de ses noms communs.
</p>
</li>
</ul></div>
<div class="para"><p>Le problème réside dans le fait que toutes ces informations sont éparpillés
entre <tt>names.dump</tt> et <tt>nodes.dump</tt> (qui contiennent également beaucoup
d'informations qui ne nous sont pas utiles). Nous avons alors effectué une
compilation de ces informations et les avons placées dans le fichier
<tt>taxonomy.csv</tt>. Voici sa structure :</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>id|nom|nom_du_parent|homonyme|liste!des!parents|liste!des!synonymes|liste!des!noms!communs|</tt></pre>
</div></div>
<div class="para"><p>Les éléments d'une liste sont séparés par un point d'exclamation. l'id est
très important car il permet de générer les liens pointant vers le site du NCBI.</p></div>
<div class="para"><p>Ainsi, à chaque fois que l'on veut mettre à jour le fichier
<tt>taxonomy.csv</tt>, il faudra lancer cette procédure. Nous avons créé un
outil qui l'effectue automatiquement. Il s'appelle <tt>preproc.py</tt>.</p></div>
<div class="para"><p>Cet outil téléchargera automatiquement l'image de la base du NCBI, extraira
les informations nécessaires et générera le fichier <tt>taxonomy.csv</tt>.</p></div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
<div class="title">A propos de base de données</div>Dans ce projet, il nous a été demandé de s'affranchir totalement de bases de
données classiques (MySQL, SQLite&#8230;) pour charger toute la taxonomie du NCBI
en RAM. Cependant, pour plus de clareté (et par habitude ?) nous continuerons
de parler de base de données du NCBI</td>
</tr></table>
</div>
<h4 id="_taxonomyreference">3.1.3. TaxonomyReference</h4>
<div class="para"><p>Cette classe permet d'interagir avec la base du NCBI et plus particulièrement
avec le fichier <tt>taxonomy.csv</tt> qu'il prend en paramètre.</p></div>
<div class="sidebarblock">
<div class="sidebar-content">
<div class="sidebar-title">Méthodes principales</div>
<div class="vlist"><dl>
<dt>
getCommonParent(self, taxa_list)
</dt>
<dd>
<p>
    retourne le premier parent commun de tous les taxons présents dans la liste
</p>
</dd>
<dt>
getHomonyms(self, name)
</dt>
<dd>
<p>
    retourne la liste des homonymes du nom passé en paramètre.<br />
    Exemple:
</p>
<div class="literalblock">
<div class="content">
<pre><tt>&gt;&gt;&gt; self.getHonomyms( "echinops" )
['echinops &lt;plant&gt;', 'echinops &lt;mammal&gt;']</tt></pre>
</div></div>
</dd>
<dt>
getIntervalParents(self, name1, name2)
</dt>
<dd>
<p>
    retourne la liste des parents intermédiaires entre deux taxons.<br />
    Exemple:
</p>
<div class="literalblock">
<div class="content">
<pre><tt>&gt;&gt;&gt; self.getIntervalParents( "eukaryota", "eutheria" )
['euarchontoglires', 'glires', 'rodentia', 'sciurognathi', 'muroidea']
&gt;&gt;&gt; self.getIntervalParents( "murinae", "eutheria" )</tt></pre>
</div></div>
</dd>
<dt>
getNCBIArborescence(self, taxa_list)
</dt>
<dd>
<p>
    cette méthode prend une liste de taxons et créé l'aborescence du NCBI en
    recherchant les parents dans la base de données.
</p>
</dd>
<dt>
getParents(self, name)
</dt>
<dd>
<p>
    retourne la liste de tous les parents d'un taxon
</p>
</dd>
<dt>
isHomonym(self, name)
</dt>
<dd>
<p>
    retourne vrai si le taxon est un homonyme.<br />
    Exemple:
</p>
<div class="literalblock">
<div class="content">
<pre><tt>&gt;&gt;&gt; self.isHomonym( "echinops" )
True</tt></pre>
</div></div>
</dd>
<dt>
isValid(self, name)
</dt>
<dd>
<p>
    retourne vrai si le nom du taxon est un nom scientifique présent dans la
    base du NCBI
</p>
</dd>
<dt>
stripTaxonName(self, taxon_name)
</dt>
<dd>
<p>
    tronque le nom passé dans le but d'en extraire le nom scientifique.<br />
    Exemple:
</p>
<div class="literalblock">
<div class="content">
<pre><tt>&gt;&gt;&gt; self.stripTaxonName( "rattus" ) -&gt; "rattus"
&gt;&gt;&gt; self.stripTaxonName( "rattus_france" ) -&gt; "rattus"
&gt;&gt;&gt; self.stripTaxonName( "rattus_rattus_france" ) -&gt; "rattus_rattus"</tt></pre>
</div></div>
</dd>
</dl></div>
</div></div>
<div class="para"><p>Cette classe est incluse dans toutes les classes de PhyloCore.</p></div>
<h4 id="_treecollection">3.1.4. TreeCollection</h4>
<div class="para"><p>Cette classe représente une collection d'arbres phylogénétiques.
Elle prend en paramètre une collection au format <em>Phylip</em>, <em>Nexus</em> ou
<em>Nexus translate</em>. Elle propose des méthodes permettant de manipuler
une collection, comme d'effectuer des filtrages et des requêtes.
Elle permet également de récupérer les statistiques de la collection.</p></div>
<div class="sidebarblock">
<div class="sidebar-content">
<div class="sidebar-title">Méthodes principales</div>
<div class="vlist"><dl>
<dt>
getCollection(self)
</dt>
<dd>
<p>
    Retourne la collection en cours ; c'est-à-dire que si une requête a
    été lancée, elle renverra la collection filtrée. Sinon, elle renverra la
    collection initiale.
</p>
</dd>
<dt>
clearQuery(self)
</dt>
<dd>
<p>
    Cette méthode permet de mettre à blanc la requête.
    La méthode <em>getCollection()</em> renverra alors la collection
    initiale.
</p>
</dd>
<dt>
query(self, query)
</dt>
<dd>
<p>
    Applique une requête à la collection. <tt>query</tt> doit être une expression du
    type :
</p>
<div class="literalblock">
<div class="content">
<pre><tt>{genre1} &gt; 3 and ( {genre2} == 2 or {genre3} &lt; 4 )</tt></pre>
</div></div>
<div class="para"><p><tt>genre</tt> peut être : soit le nom d'un taxon (<em>rattus_rattus</em>), soit le nom
d'une espèce (<em>murinae</em>). <tt>genre</tt> doit être entre accolade. Le reste de la
requête est une expression python classique (d'où l'utilisation du <tt>==</tt>).
En fait, les noms entre accolades seront remplacés par leur occurence dans
la collection. Nous obtenons donc une expression python classique qui
sera évaluée :</p></div>
<div class="literalblock">
<div class="content">
<pre><tt>4 &gt; 3 and ( 1 == 2 or 3 &lt; 4 )</tt></pre>
</div></div>
</dd>
<dt>
displayHomonymList(self)
</dt>
<dd>
<p>
    Cette méthode retourne la liste des homonymes au format HTML.
</p>
<div class="para"><p><strong>Remarque</strong> : <em>Cette méthode doit être réécrite de manière à tenir compte du MVC</em></p></div>
</dd>
<dt>
displayStats(self, allparents=False)
</dt>
<dd>
<p>
    Cette méthode renvoie l'abre du NCBI au format HTML. Cette arbre contient
    des données statistiques qui permettent de connaître le nombre d'occurences
    d'une espèce dans la collection.
</p>
<div class="para"><p><strong>Remarque</strong> : <em>Cette méthode doit être réécrite de manière à tenir compte du MVC.
 Elle doit se trouver dans une template</em></p></div>
</dd>
<dt>
filter(self, taxa_list)
</dt>
<dd>
<p>
    Cette méthode va supprimer certains taxons de la collection d'arbres. Elle
    est très utile pour ne travailler que sur une partie de la taxonomie sans
    être polluée par d'autres taxons.
</p>
<div class="para"><p>Cette méthode prend en paramètre la liste des taxons à supprimer.</p></div>
</dd>
<dt>
getNCBITreeAsNwk(self)
</dt>
<dd>
<p>
    Cette méthode renvoie l'arborescence du NCBI de la collection au format
    Newick. Elle est utilisée si l'on souhaite télécharger l'arbre modèle du
    NCBI.
</p>
</dd>
<dt>
getNbTrees(self, taxon)
</dt>
<dd>
<p>
    Retourne le nombre d'arbres dans lesquels se trouve un taxon
</p>
</dd>
<dt>
initStat(self)
</dt>
<dd>
<p>
    Lorsque l'on fait des requêtes, on ne travaille que sur une partie de la
    collection. Cette méthode permet de mettre à jour les statistiques.
</p>
</dd>
<dt>
stat1(self)
</dt>
<dd>
<p>
    Cette méthode permet de connaître le nombre
    d'arbres à n feuilles. Elle renvoie un dictionnaire qui aura comme clé le
    début de l'intervalle. Voir la section statistiques pour plus de détails.
</p>
</dd>
<dt>
stat2(self)
</dt>
<dd>
<p>
    Cette méthode permet de connaître le nombre de taxons présents dans <em>n</em>
    arbres. Comme <em>stat1</em>, elle renvoie un dictionnaire. Voir la section
    statistiques pour plus de détails.
</p>
</dd>
</dl></div>
</div></div>
<div class="listingblock">
<div class="title">Exemple d'utilisation</div>
<div class="content">
<pre><tt><strong>from</strong> treecollection <strong>import</strong> TreeCollection

<i># Instanciation. On passe une collection au format Nexus en paramètre</i>
mycollection = TreeCollection( open("mycol.tre").read() )

<i># Récupère la collection</i>
<strong>print</strong> mycollection.getCollection()

<i># Combien d'arbres sont dans la collection</i>
<strong>print</strong> len( mycollection.getCollection() )

<i># Effectue une requête afin de ne garder que les arbres dont les murinaes</i>
<i># sont supérieurs à 1</i>
mycollection.query( "{murinae} &gt; 1" )

<i># Récupère la nouvelle collection</i>
my_new_collection = mycollection.getCollection()

<i># Efface la requête</i>
mycollection.clearQuery()

<i># Récupère la collection originelle</i>
mycollection.getCollection()

<i># Filtrage. On supprime tous les taxons "mus", "pan" et "homo" de la</i>
<i># collection. Le résultat sera une chaine de caractère au format Nexus.</i>
nexus_string = mycollection.filter( ["mus", "pan", "homo"] )</tt></pre>
</div></div>
<div class="para"><p>On voit bien dans cette exemple que la méthode <tt>query</tt> influera sur la méthode
<tt>getCollection</tt> qui ne renverra alors qu'une partie de la collection. La méthode
<tt>clearQuery</tt> permet d'effacer les effets de la requête.</p></div>
<h5 id="_statistiques">Statistiques</h5>
<div class="para"><p>PhyloExplorer fournit deux types de statistiques. La première présente le
nombre d'arbres à <em>n</em> feuilles :</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>10 feuilles -&gt; 3 arbres
12 feuilles -&gt; 9 arbres
16 feuilles -&gt; 3 arbres
20 feuilles -&gt; 4 arbres
24 feuilles -&gt; 9 arbres
26 feuilles -&gt; 8 arbres
30 feuilles -&gt; 1 arbres
31 feuilles -&gt; 2 arbres
32 feuilles -&gt; 1 arbres
40 feuilles -&gt; 3 arbres
...</tt></pre>
</div></div>
<div class="para"><p>Le problème résidait dans le fait qu'il pouvait y avoir une quantité
considérable d'arbres au nombre de feuilles différent. L'idée ici est de
regrouper le nombre de feuilles par tranches :</p></div>
<div class="listingblock">
<div class="title">Exemple de répartition par tranche de 10</div>
<div class="content">
<pre><tt>de 0 à 10 feuilles -&gt; 0 arbres
de 10 à 20 feuilles -&gt; 15 arbres
de 20 à 30 feuilles -&gt; 21 arbres
de 30 à 40 feuilles -&gt; 4 arbres
de 40 à 50 feuilles -&gt; 3 arbres
...</tt></pre>
</div></div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<div class="title">Remarque</div>
</td>
<td class="content">L'intervalle ne comprend pas la dernière valeur (de 0 à 10 feuilles
représentera l'intervalle <tt>[0,10]</tt>)</td>
</tr></table>
</div>
<div class="para"><p>La grandeur de l'intervalle (que nous appellerons <em>ratio</em>) est calculée par
l'équation : <tt>nbmax*10.0/100</tt> où <tt>nbmax</tt> est le nombre maximum de
feuilles présentes par arbre dans la collection (ici 40). Cela permet de
n'avoir qu'une dizaine de barres dans notre histogramme.</p></div>
<div class="para"><p>Le dictionnaire renvoyé sera du type
<tt>{<em>nombre de feuilles</em> : <em>nombre d'arbres</em>}</tt>.
Donc pour l'exemple ci-dessus on aura :</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>{0:0, 10:15, 20:21, 30:4, 40:3 ...}</tt></pre>
</div></div>
<div class="para"><p>La statistique numéro 2 calcule la fréquence de distribution des taxons dans
la collection. Le ratio est calculé sur le même principe que précédemment.</p></div>
<h4 id="_phylogenetictree">3.1.5. PhylogeneticTree</h4>
<div class="para"><p>Cette classe permet d'afficher un arbre phylogénétique au format HTML. La
représentation se fait sous forme d'arborescence simple. Par soucis de
performances, cette classe est chargée uniquement lors de l'affichage d'un
arbre phylogénétique. Ainsi, toutes les opérations relatives aux arbres se
trouvent soit dans la bibliothèque <em>Phylogelib</em>, soit dans la classe
<em>TreeCollection</em>.</p></div>
<div class="para"><p><center> <span class="image">
<img src="phylo2.png" alt="phylo2.png" />
</span> </center></p></div>
<h3 id="_phyloweb">3.2. PhyloWeb</h3><div style="clear:left"></div>
<div class="para"><p>Dans cette partie, nous allons examiner le projet PhyloExplorer à proprement
parler ; c'est-à-dire la partie applicative. PhyloWeb est composée de deux
grands ensembles : le serveur web PhyloExplorer.py et les templates qui lui
sont associées.</p></div>
<h4 id="_phyloexplorer_py">3.2.1. PhyloExplorer.py</h4>
<div class="para"><p>Ce fichier représente en quelque sorte le <em>main</em> du projet. C'est ce script
qu'il faudra lancer pour exécuter le serveur web. L'application sera alors
accessible via l'adresse <tt>http://adresse_ip:port</tt> où <tt>adresse_ip</tt> et <tt>port</tt>
sont définis dans le fichier de configuration <tt>phyloexplorer.conf</tt>.</p></div>
<div class="para"><p>Le fichier <tt>phyloexplorer.py</tt> est composé de la classe PhyloExplorer, qui sera
utilisée par l'outil CherryPy. Cette classe possède plusieurs particularités
qui sont propres à CherryPy comme l'exposition d'une méthode.</p></div>
<div class="para"><p>Une méthode exposée est une méthode qui sera accessible via l'URL de
l'application. Elle est reconnaissable par son décorateur :
<tt>@cherrypy.expose</tt>. Chaque méthode exposée doit renvoyer une chaine de
caractères qui sera affichée telle quelle à l'utilisateur. Cette chaine doit donc
être au format HTML.</p></div>
<div class="para"><p>Pour plus d'informations concernant le serveur web, consulter la
documentation de CherryPy.</p></div>
<div class="para"><p>Pour renvoyer du HTML, nous utilisons la méthode <tt>self._presentation</tt> qui
prend en paramètre, le nom de la template à utiliser, un message d'information
(facultatif) et une petite chaine de caractères qui sera placée en haut de la
page et indiquera où se trouve l'utilisateur (ex : <tt>Home &gt; Statistics</tt>).</p></div>
<h4 id="_les_templates">3.2.2. Les templates</h4>
<div class="para"><p>L'utilisation des templates mérite que l'on s'y attarde un petit peu. Toutes
les templates sont regroupées dans le répertoire "templates". Ce répertoire
regroupe aussi les styles CSS et scripts Javascript.</p></div>
<div class="para"><p>Une template, bien qu'ayant l'extension <tt>.html</tt>, est un ensemble de code
python et de HTML. Le code python est placé entre les balises <tt>&lt;%</tt> et <tt>%&gt;</tt>.</p></div>
<div class="listingblock">
<div class="title">Une template basique</div>
<div class="content">
<pre><tt>&lt;%
<strong>if</strong> True:
%&gt;
    &lt;%|%&gt;                           <b>(1)</b>
    &lt;b&gt; Hello World ! &lt;/b&gt;
&lt;%
<strong>else</strong>:
    <i>#                               <b>(2)</b></i>
%&gt;
    &lt;i&gt; Hello Me ! &lt;/i&gt;
&lt;%|%&gt;</tt></pre>
</div></div>
<div class="para"><p>Le moteur de template Pleet va évaluer le code python et renverra le résultat.
Dans cet exemple, <tt>True</tt> est toujours vrai donc <tt>Hello Word</tt> sera toujours
affiché.</p></div>
<div class="para"><p>Le symbole <tt>&lt;%|%&gt;</tt> <strong>(1)</strong> permet de spécifier l'indentation. On indique ainsi au
moteur de template si on se trouve toujours dans le <tt>if</tt> ou non.</p></div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">Le fait de placer une ligne de commentaire <strong>(2)</strong> spécifie également l'indentation.</td>
</tr></table>
</div>
<div class="para"><p>Pleet permet "d'exposer" des objets afin qu'ils puissent être utilisés dans les
templates.</p></div>
<div class="listingblock">
<div class="title">Exposition d'un objet</div>
<div class="content">
<pre><tt>pleet["_civilite_"] = civilite</tt></pre>
</div></div>
<div class="para"><p>Dans cet exemple, on rend la variable <tt>civilite</tt> accessible dans la
template sous le nom <tt>_civilite_</tt>.</p></div>
<div class="listingblock">
<div class="title">Utilisation d'un objet exposé</div>
<div class="content">
<pre><tt>Bonjour
&lt;%
<strong>if</strong> _civilite_ == "Mme":
    <i>#</i>
%&gt;
    Madame,
&lt;%
<strong>elif</strong> _civilite_ == "Mlle":
    <i>#</i>
%&gt;
    Mademoiselle,
&lt;%
<strong>else</strong>:
    <i>#</i>
%&gt;
    Monsieur,
&lt;%|%&gt;</tt></pre>
</div></div>
<div class="para"><p>Dans cet exemple, une série de tests sur la variable <tt>_civilite_</tt> permettra de
produire la bonne template.</p></div>
</div>
<h2 id="_s_curit">4. Sécurité</h2>
<div class="sectionbody">
<div class="para"><p>Par manque d'infrastructure et d'outils dédiés, nous n'avons pas pu estimer le
taux de charge du serveur. En ce qui concerne la sécurité, nous avons fait
particulièrement attention à éviter la possibilité d'injection de code et de XSS.</p></div>
<div class="para"><p>Pour plus d'informations concernant la sécurité du serveur, merci de se référer
à la documentation de CherryPy</p></div>
</div>
<h2 id="_evolutions_futures">5. Evolutions futures</h2>
<div class="sectionbody">
<div class="para"><p>Il existe une bibliothèque appellé BioPython qui fournit des classes et
des méthodes permettant de travailler dans le contexte de la biologie.</p></div>
<div class="para"><p>Cette bibliothèque est très complète et très complexe. Ayant tout ce dont nous
avions besoin avec la Phylogelib, et découvrant cette bibliothèque
tardivement dans le projet, nous n'avons pas eu le temps d'appronfondir son
utilité. Il serait intéressant de savoir si BioPython (qui est soutenue par une
communauté internationale de développeurs) peut remplacer Phylogelib (qui reste
très jeune).</p></div>
</div>
<h1 id="_guide_d_installation">Guide d'installation</h1>
<div class="para"><p>Cette partie détaille la procédure d'installation et de configuration de
l'application web PhyloExplorer.</p></div>
<h2 id="_pr_requis">1. Prérequis</h2>
<div class="sectionbody">
<div class="para"><p>Pour une utilisation optimale, PhyloExplorer nécessite au minimum 2 Go de
mémoire RAM. Prévoir également un processeur cadencé à 2 Ghz et 200 Mo d'espace
disque pour l'installation.</p></div>
</div>
<h2 id="_installation">2. Installation</h2>
<div class="sectionbody">
<h3 id="_installation_des_d_pendances">2.1. Installation des dépendances</h3><div style="clear:left"></div>
<div class="para"><p>PhyloExplorer nécessite les bibliothèques suivantes :</p></div>
<div class="ilist"><ul>
<li>
<p>
Python &gt;= 2.4 : (<a href="http://www.python.org"><tt>http://www.python.org</tt></a>)
</p>
</li>
<li>
<p>
CherryPy &gt;= 3.0 (<a href="http://www.cherrypy.org/"><tt>http://www.cherrypy.org/</tt></a>)
</p>
</li>
<li>
<p>
NetworkX &gt;= 0.35 (<a href="https://networkx.lanl.gov/wiki"><tt>https://networkx.lanl.gov/wiki</tt></a>)
</p>
</li>
<li>
<p>
Pleet (le paquet est disponible dans tools)
</p>
</li>
</ul></div>
<div class="para"><p>Chacune de ces bibliothèques s'installe très facilement : extraire l'archive
et taper simplement sous root <tt>$ python setup install.py</tt>.</p></div>
<h3 id="_installation_de_phyloexplorer">2.2. Installation de PhyloExplorer</h3><div style="clear:left"></div>
<div class="para"><p>Taper simplement en root la commande :</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>python setup.py</tt></pre>
</div></div>
<div class="para"><p>Si vous n'avez pas les droits, vous pouvez l'installer dans un répertoire
définit en tapant :</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>python setup.py /chemin/vers/le/répertoire</tt></pre>
</div></div>
<div class="para"><p>Voici la structure de l'application dans l'arborescence de fichiers:</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>bin:
    phyloexplorer                   <b>(1)</b>

share/phyloexplorer/data:
    taxonomy.csv                    <b>(2)</b>

share/phyloexplorer/etc:
    phyloexplorer.conf              <b>(3)</b>

share/phyloexplorer/templates:      <b>(4)</b>
    about.html
    check.html
    error.html
    favicon.ico
    footer.html
    getallsugestions.html
    header.html
    help.html
    index.html
    jquery-1.2.3.js
    jquery.blockUI.js
    NautilusBlack.jpg
    NautilusBlue.jpg
    NautilusDarkBlue.jpg
    NautilusDarkGreen.jpg
    NautilusGreen.jpg
    NautilusGrey.jpg
    NautilusWhite.jpg
    phyloexplorer.js
    site.css
    statistics.html
    taxomanie.js

share/phyloexplorer/tools:
    preproc.py                     <b>(5)</b>

<b>(1)</b> Serveur stand-alone du serveur web
<b>(2)</b> "Base de données" du NCBI
<b>(3)</b> Fichier de configuration du serveur web
<b>(4)</b> Répertoire où se situent toutes les templates
<b>(5)</b> Outil permettant de générer le fichier taxonomy.csv</tt></pre>
</div></div>
</div>
<h2 id="_configuration">3. Configuration</h2>
<div class="sectionbody">
<div class="para"><p>Le serveur web utilise le fichier <tt>phyloexplorer.conf</tt> pour sa configuration.
Voici sa structure :</p></div>
<div class="listingblock">
<div class="content">
<pre><tt>[global]
log.screen = 0
server.socket_host = "127.0.0.1"
server.socket_port = 8080
server.thread_pool = 10
session.timeout = 1800
proxy = "www.info-ufr.univ-montp2.fr:3128"</tt></pre>
</div></div>
<div class="vlist"><dl>
<dt>
log.screen
</dt>
<dd>
<p>
Cette variable est un booléen. Si elle est vraie (positionnée à 1), des
informations de débogage seront envoyées sur la sortie standard de la console.
Cette variable doit être mise à 0 pour un serveur de production.
Voir la documentation de CherryPy pour plus de détails.
</p>
</dd>
<dt>
server.socket_host
</dt>
<dd>
<p>
Définit l'adresse IP de la machine où est lancé le serveur.
Voir la documentation de CherryPy pour plus de détails.
</p>
</dd>
<dt>
server.socket_port
</dt>
<dd>
<p>
Définit le port où devra être accessible l'application.
Voir la documentation de CherryPy pour plus de détails.
</p>
</dd>
<dt>
server.thread_pool
</dt>
<dd>
<p>
Définit le nombre d'instances à déployer. Plus le nombre de connexions est
élevé, plus ce chiffre doit augmenter.
Voir la documentation de CherryPy pour plus de détails.
</p>
</dd>
<dt>
session.timeout
</dt>
<dd>
<p>
Précise la durée de la session d'un utilisateur. Elle se définit en secondes
et indique la période d'inactivité autorisée de l'utilisateur avant
l'expiration de sa session. Par défault elle est de 30 minutes.
</p>
</dd>
<dt>
proxy (facultatif)
</dt>
<dd>
<p>
Cette variable est propre à PhyloExplorer (i.e: ne provient pas de CherryPy).
Elle permet de spécifier l'adresse du proxy afin d'autoriser l'affichage des
images et la correction du nom des taxons. Si vous avez un problème avec ces
fonctionnalités, vous devriez vérifier que cette variable est correctement
renseignée.
</p>
</dd>
</dl></div>
</div>
<h1 id="_guide_de_l_utilisateur">Guide de l'utilisateur</h1>
<div class="para"><p>Dans cette section, nous allons effectuer un parcours des possibilités de
PhyloExplorer du point de vue de l'utilisateur.</p></div>
<h2 id="_etape_1_chargement_de_donn_es">1. Etape 1: Chargement de données</h2>
<div class="sectionbody">
<div class="para"><p>La première page de PhyloExplorer comporte un menu simple :</p></div>
<div class="ilist"><ul>
<li>
<p>
<strong>Upload Collection</strong> (qui permet à tout moment de charger une nouvelle collection d'arbres)
</p>
</li>
<li>
<p>
<strong>Help contents</strong> (qui est une page d'aide, un bref récapitulatif des fonctionnalités et procédures de PhyloExplorer)
</p>
</li>
<li>
<p>
<strong>About</strong> (qui, comme son nom l'indique, renseigne sur les créateurs et fait une brève description de PhyloExplorer)
</p>
</li>
</ul></div>
<div class="para"><p>L'utilisateur doit :</p></div>
<div class="ilist"><ul>
<li>
<p>
soit charger son fichier d'arbres Phylip (Newick), Nexus ou Nexus Translate à partir de cette Homepage
</p>
</li>
</ul></div>
<div class="para"><p><center><span class="image">
<img src="champ_choose_your_file.png" alt="champ_choose_your_file.png" />
</span></center></p></div>
<div class="ilist"><ul>
<li>
<p>
soit saisir à la main des arbres Phylip (Newick), Nexus ou Nexus Translate dans le champ prévu à cet effet
</p>
</li>
</ul></div>
<div class="para"><p><center><span class="image">
<img src="champ_paste_collection.png" alt="champ_paste_collection.png" />
</span></center></p></div>
<div class="para"><p>Dans notre exemple, nous choisissons une collection de 7 arbres (dans un fichier newick) comportant des erreurs intentionnellement (nous verrons leur utilité par la suite).</p></div>
<div class="para"><p>Ne pas oublier de préciser, si besoin est, le type de séparateur mis en cause dans la collection sélectionnée. C'est-à-dire le séparateur qui lie les noms qui composent les espèces.</p></div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<div class="title">Exemple</div>
</td>
<td class="content">"Macropus eugenii" ou "Macropus_eugenii"</td>
</tr></table>
</div>
<div class="para"><p>Cliquer alors sur <span class="image">
<img src="bouton_upload.png" alt="bouton_upload.png" />
</span> pour envoyer la collection au serveur.</p></div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">Suivant la taille de votre collection, le message &#8220;Please wait&#8221; apparaissant à l'écran peut vous paraître plus ou moins long.</td>
</tr></table>
</div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">Le bouton <span class="image">
<img src="bouton_clear.png" alt="bouton_clear.png" />
</span> permet de remettre les champs impactés à zéro.</td>
</tr></table>
</div>
</div>
<h2 id="_etape_2_arriv_e_sur_la_page_statistics">2. Etape 2: Arrivée sur la page "statistics"</h2>
<div class="sectionbody">
<h3 id="_r_sum">2.1. Résumé</h3><div style="clear:left"></div>
<div class="para"><p><center><span class="image">
<img src="page_statistics.png" alt="page_statistics.png" height="800" />
</span></center></p></div>
<div class="para"><p>Cette page est un tableau de bord de la collection utilisateur chargée. Elle indique:</p></div>
<div class="vlist"><dl>
<dt>
<strong>zone entourée en vert</strong>
</dt>
<dd>
<div class="ilist"><ul>
<li>
<p>
le nombre d'arbres dans la collection
</p>
</li>
<li>
<p>
le nombre total de taxons
</p>
</li>
<li>
<p>
avec en plus le nombre de taxons mal écrits (ils apparaissent en rouge s'il y en a)
</p>
</li>
<li>
<p>
et aussi le nombre d'homonymes (taxons ambigus apparaissant en orange)
</p>
</li>
</ul></div>
</dd>
<dt>
<strong>zone entourée en noir</strong>
</dt>
<dd>
<p>
les corrections possibles à faire dans la collection
</p>
</dd>
<dt>
<strong>zones entourées en rouge et en orange</strong>
</dt>
<dd>
<div class="ilist"><ul>
<li>
<p>
la pondération des arbres
</p>
</li>
<li>
<p>
la distribution des taxons dans les arbres
</p>
</li>
</ul></div>
</dd>
<dt>
<strong>zone entourée et encadrée en gris</strong>
</dt>
<dd>
</dd>
</dl></div>
<div class="exampleblock">
<div class="exampleblock-content">
<div class="ilist"><ul>
<li>
<p>
l'arborescence de tous les taxons de la collection chargée, construite selon le NCBI
</p>
</li>
</ul></div>
<div class="para"><p><center><span class="image">
<img src="arbo_ncbi_taxonomy.png" alt="arbo_ncbi_taxonomy.png" height="1000" />
</span></center></p></div>
<div class="ilist"><ul>
<li>
<p>
une visualisation sous forme de graphe de l'arbre représentant la collection (basée uniquement sur le fichier chargé [corrigé ou non])
</p>
</li>
</ul></div>
<div class="para"><p><center><span class="image">
<img src="arbo_ncbi_phylowidget.png" alt="arbo_ncbi_phylowidget.png" />
</span></center></p></div>
</div></div>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">il faut s'assurer d'avoir Java 1.5 minimum installé sur la machine client pour visualiser ce graphe.</td>
</tr></table>
</div>
<div class="para"><p>Le menu (<em>zone entourée en bleu</em>) est adapté à la collection actuellement en cours de traitement.</p></div>
<h3 id="_interaction">2.2. Interaction</h3><div style="clear:left"></div>
<div class="para"><p>On peut bien sûr interagir avec cette page :</p></div>
<div class="ilist"><ul>
<li>
<p>
pour corriger les taxons erronés de la collection (s'il y en a), il suffit de cocher le bouton radio qui convient (situé à droite de chaque taxon)
</p>
</li>
<li>
<p>
il en est de même pour les homonyms (qui apparaissent en orange)
</p>
</li>
<li>
<p>
une fois les boutons radio sélectionnés, il suffit de valider la sélection en cliquant sur <span class="image">
<img src="bouton_correct_collection.png" alt="bouton_correct_collection.png" />
</span>
</p>
</li>
</ul></div>
<div class="para"><p>La correction de la collection a pour effet de faire disparaitre le champ
entier "<strong>Correct your collection</strong>" puisqu'elle est corrigée à ce stade.</p></div>
<h3 id="_histogrammes_de_statistiques">2.3. Histogrammes de statistiques</h3><div style="clear:left"></div>
<div class="para"><p>Le premier graphique indique le nombre de taxons qui composent les arbres.
C'est un graphique à bâtons se lisant à l'horizontale.</p></div>
<div class="sidebarblock">
<div class="sidebar-content">
<div class="para"><p><center><span class="image">
<img src="histogramme1.png" alt="histogramme1.png" />
</span></center></p></div>
<div class="vlist"><dl>
<dt>
Nous avons ici:
</dt>
<dd>
<div class="ilist"><ul>
<li>
<p>
1 arbre qui comporte entre 0 et 2 taxons
</p>
</li>
<li>
<p>
3 arbres qui comportent entre 3 et 5 taxons
</p>
</li>
<li>
<p>
&#8230; ainsi de suite
</p>
</li>
</ul></div>
</dd>
</dl></div>
</div></div>
<div class="para"><p>Le second graphique indique le nombre d'arbres dans lesquels se trouve chacun des taxons.</p></div>
<div class="sidebarblock">
<div class="sidebar-content">
<div class="para"><p><center><span class="image">
<img src="histogramme2.png" alt="histogramme2.png" />
</span></center></p></div>
<div class="vlist"><dl>
<dt>
Dans ce graphique, nous voyons:
</dt>
<dd>
<div class="ilist"><ul>
<li>
<p>
1 taxon qui se retrouve dans 36 arbres
</p>
</li>
<li>
<p>
2 taxons qui se retrouvent dans 5 arbres
</p>
</li>
<li>
<p>
&#8230; etc
</p>
</li>
</ul></div>
</dd>
</dl></div>
</div></div>
<h3 id="_arborescence_ncbi">2.4. Arborescence NCBI</h3><div style="clear:left"></div>
<div class="para"><p>Cet arbre englobe toute la collection construite correctement. Au fur et à
mesure des corrections de l'utilisateur, l'arbre est regénéré. En effet, il
faut tenir compte des nouveaux taxons corrigés dans la collection.</p></div>
<div class="para"><p>L'utilisateur pourra remarquer que le nombre de taxons augmente si le taxon corrigé n'était pas dans l'arbre,
ou bien reste inchangé si le taxon corrigé correspondait à un taxon déjà dans l'arbre.</p></div>
<h4 id="_l_gende_des_informations_affich_es_dans_l_arbre_ncbi">2.4.1. Légende des informations affichées dans l'arbre NCBI</h4>
<h5 id="_code_couleur">Code couleur</h5>
<div class="ilist"><ul>
<li>
<p>
<span style="color: darkblue;"><strong>Bleu foncé</strong></span> : les noms des espèces
</p>
</li>
<li>
<p>
<span style="color: #66f;"><strong>Bleu clair</strong></span> : les noeuds internes de l'arbre (les parents communs des espèces)
</p>
</li>
<li>
<p>
<span style="color: blue;"><strong>Bleu normal</strong></span> : chaque noeud et feuille de l'arbre est accompagné de 2 nombres à côté de son nom. Le premier nombre comptabilise le nombre d'espèces représentant le noeud. Le second nombre représente le nombre d'arbres dans lesquels il se trouve
</p>
</li>
<li>
<p>
<span style="color: grey;"><strong>Gris</strong></span> : effectuer des actions ou afficher un complément d'informations
</p>
</li>
</ul></div>
<h5 id="_informations_et_actions">Informations et actions</h5>
<div class="vlist"><dl>
<dt>
Etiquette "Show parents"
</dt>
<dd>
<p>
On aperçoit sur cet arbre NCBI une étiquette <span class="image">
<img src="etiquette_show_parents.png" alt="etiquette_show_parents.png" />
</span> à côté de certains noeuds/feuilles. En cliquant dessus, on a accès à la liste des parents intermédiaires du noeud/feuille concerné(e) jusqu'au parent commun le plus proche affiché juste au dessus de ce noeud/feuille.
</p>
<div class="para"><p>Cette étiquette a été ajoutée pour une meilleure lisibilité de l'arbre (parents intermédiaires masqués par défaut).</p></div>
</dd>
<dt>
Informations sur les nombres à droite des noeuds
</dt>
<dd>
<p>
Le chiffre de gauche correspond au nombre d'occurences de l'espèce dans la
collection. Celui de droite représente le nombre d'arbres qui contiennent
l'espèce.
</p>
<div class="admonitionblock">
<table><tr>
<td class="icon">
<div class="title">Exemple</div>
</td>
<td class="content">
<div class="para"><p><span class="image">
<img src="exemple_murinae_6_4.png" alt="exemple_murinae_6_4.png" />
</span></p></div>
<div class="para"><p>En cliquant sur &#8220;<tt>6</tt>&#8221;, on peut parcourir les 6 arbres qui contiennent des &#8220;Murinae&#8221;.
Le survol de ce chiffre informe de cette action.</p></div>
<div class="para"><p>En survolant le chiffre &#8220;<tt>4</tt>&#8221;, on a brièvement accès cette fois-ci à la
liste des quatre Murinaes concernés dans ces six arbres.
Attention, cette information ne s'affiche pas longtemps.</p></div>
<div class="para"><p>Ci-dessous affichées les 9 espèces qui représentent <em>Haplorrhini</em> par exemple.
<span class="image">
<img src="souris_title.png" alt="souris_title.png" />
</span></p></div>
</td>
</tr></table>
</div>
</dd>
<dt>
Informations sur les taxons et noeuds internes
</dt>
<dd>
<p>
En survolant à la souris le nom des taxons ou des noeuds internes, on peut
apercevoir une image correspondant à ce nom au coin inférieur droit de la
page. Le nom survolé est à nouveau inscrit au dessus de l'image.
Ces images sont issues de WikiSpecies et Wikipedia.
</p>
<div class="para"><p>En cliquant sur les noeuds internes ou les taxons, on est redirigé sur le
<a href="http://www.ncbi.nlm.nih.gov/">NCBI</a> (dans une nouvelle page) correspondant
au taxon ou noeud interne cliqué. On accède alors à plus d'informations sur
l'élément.</p></div>
</dd>
<dt>
Filtrage
</dt>
<dd>
<p>
L'arbre de la taxonomie du NCBI peut être filtré par l'utilisateur. Pour se
faire, chaque élément de l'arbre comporte une case à cocher à sa gauche ; il
suffit de cocher cette case pour signifier qu'on souhaite enlever tel ou tel
élément dans la collection entière. Les descendants de l'élément coché sont
automatiquement sélectionnés (s'il a des fils). Il ne reste plus qu'à cliquer
sur <span class="image">
<img src="bouton_restrict_your_trees.png" alt="bouton_restrict_your_trees.png" />
</span> pour appliquer le filtre.
</p>
<div class="para"><p>On peut se servir des étiquettes <span class="image">
<img src="etiquette_select_all.png" alt="etiquette_select_all.png" />
</span> et
<span class="image">
<img src="etiquette_unselect_all.png" alt="etiquette_unselect_all.png" />
</span> pour sélectionner/désélectionner tous les
éléments de l'arbre suivant la proportion d'éléments de l'arbre que l'on a à
filtrer. Ainsi, il est plus facile de décocher/cocher ce que l'on souhaite
conserver/enlever dans la collection.</p></div>
</dd>
<dt>
Graphe
</dt>
<dd>
<p>
Le lien en vert (<span style="color: green;">Click to visualize this tree as graph</span>) permet à
l'utilisateur d'avoir une vue sous forme de graphe des espèces qui composent
sa collection (filtrée ou non). Un clic sur ce lien ouvre une nouvelle page
vers le site <a href="http://www.phylowidget.org">PhyloWidget</a> en affichant la
collection complète (ou filtrée) de l'utilisateur.
</p>
</dd>
</dl></div>
<h3 id="_les_requ_tes">2.5. Les requêtes</h3><div style="clear:left"></div>
<div class="para"><p>Le champ de requêtes, que nous n'avons pas détaillé jusque là, permet à
l'utilisateur d'extraire des informations sur sa collection. Ces requêtes lui
permettent de rechercher, sur l'ensemble des arbres, la présence (ou
l'absence) de taxon ou noeuds internes (parents communs). Ces requêtes peuvent
être effectuées avec les opérateurs classiques: <tt>&gt;</tt>, <tt>&lt;</tt>, <tt>&gt;=</tt>, <tt>&lt;=</tt>, <tt>==</tt>,
<tt>AND</tt>, <tt>OR</tt>, <tt>NOT</tt>. Les priorités des opérations sont définies par les
parenthèses. La casse n'a pas d'importance, de même que les espaces entre les
opérateurs.</p></div>
<div class="para"><p>Les taxons ou noeuds internes de la requête doivent être entourés par des
accolades. Ceci afin de grouper les éléments comportant des espaces.</p></div>
<div class="sidebarblock">
<div class="sidebar-content">
<div class="sidebar-title">Exemple de requête</div>
<div class="listingblock">
<div class="content">
<pre><tt>{murinae} == 2 and not {echinops &lt;plant&gt;} or ( {homo} and {homo sapiens} and {catarrhini}&gt;2} )</tt></pre>
</div></div>
<div class="para"><p>Dans cet exemple, on cherche à sélectionner les arbres qui comportent
exactement deux <em>murinae</em> mais pas d'<em>echinops &lt;plant&gt;</em> ou bien les arbres qui
comportent des <em>homo</em>, des <em>homo sapiens</em> et où les <em>catarrhini</em> sont supérieurs à
2.</p></div>
</div></div>
<div class="para"><p>Effectuer une requête sur ce tableau de bord permet de "filtrer" (ou effectuer
des recherches dans) les arbres sans perdre le contenu de sa collection. De
plus, les données affichées dans la zone <strong>General informations of the
collection</strong> (<em>entourée en vert dans la capture précédente</em>) changent
évidemment en fonction du résultat de la requête (le nombre d'arbres diminue
en conséquence).</p></div>
<div class="para"><p>Prenons l'exemple de la requête <tt>{rodentia} and {lagomorpha}</tt> sur la
collection à 7 arbres. Après la requête, le nombre d'arbres est passé à 3. Ce
qui signifie que seuls 3 arbres sur les 7 comportent des <em>rodentia</em> et des
<em>lagommorpha</em>.</p></div>
<div class="para"><p><span class="image">
<img src="champ_general_apres_requete.png" alt="champ_general_apres_requete.png" />
</span></p></div>
<div class="para"><p>Pour annuler les effets de cette requête, il faut cliquer sur <span style="color: blue;"><strong>Back to
full collection</strong></span> qui est apparu après l'exécution de la requête.</p></div>
<h3 id="_t_l_chargement">2.6. Téléchargement</h3><div style="clear:left"></div>
<div class="para"><p>Après avoir corrigé, désambiguisé ou filtré sa collection, l'utilisateur peut la
télécharger.</p></div>
<div class="para"><p><center><span class="image">
<img src="menu_download_collection.png" alt="menu_download_collection.png" />
</span></center></p></div>
<div class="para"><p>Il peut également télécharger l'arborecence du NCBI restreinte à la liste des
taxons présents dans la collection.</p></div>
<div class="para"><p><center><span class="image">
<img src="menu_download_ncbi.png" alt="menu_download_ncbi.png" />
</span></center></p></div>
</div>
<h2 id="_etape_3_naviguer_dans_la_collection">3. Etape 3: Naviguer dans la collection</h2>
<div class="sectionbody">
<div class="para"><p>En cliquant dans le menu sur <span class="image">
<img src="menu_browse_collection.png" alt="menu_browse_collection.png" />
</span>, l'utilisateur a tout le loisir de parcourir sa collection arbre par arbre.</p></div>
<div class="para"><p>Le menu dédié à sa collection actuelle se résume alors à
<span class="image">
<img src="menu_bouton_back_statistics.png" alt="menu_bouton_back_statistics.png" />
</span> et à
<span class="image">
<img src="menu_bouton_download_collection.png" alt="menu_bouton_download_collection.png" />
</span>. La navigation entre les arbres se
fait au moyen des boutons [blue]Next et [blue]Previous.</p></div>
<div class="para"><p>A chaque arbre, différentes informations sont affichées :</p></div>
<div class="para"><p><center><span class="image">
<img src="navigation_arbre.png" alt="navigation_arbre.png" />
</span></center></p></div>
<div class="ilist"><ul>
<li>
<p>
le nom de l'arbre&#8230; que l'on peut choisir à l'aide du menu déroulant (<em>zone
  entourée en vert sur la capture ci-dessus</em>)
</p>
</li>
<li>
<p>
le numéro de l'arbre dans la collection que l'on peut saisir directement
  dans le champ text (<em>zone entourée en jaune</em>)
</p>
</li>
<li>
<p>
des éventuels messages d'erreur (<em>zone entourée en rouge</em>). Ici il est
  indiqué que la collection comporte trois mauvais taxons. Si on ne les a pas
  encore corrigés, on peut retourner sur la page des statistiques ("<em>Back to
  statistics</em>") pour le faire.
</p>
</li>
<li>
<p>
les taxons marqués en rouge dans l'arbre sont mal écrits (ou inconnus du NCBI)
</p>
</li>
<li>
<p>
les taxons ambigus (les homonymes) sont marqués en orange (<em>zone entourée en violet</em>)
</p>
</li>
</ul></div>
<div class="para"><p>Comme déjà indiqué dans la description des "Statistiques", il est possible de développer les noeuds internes dans l'arbre. On peut les développer tous en même temps en cliquant sur <span class="image">
<img src="etiquette_show_hide_all_parents.png" alt="etiquette_show_hide_all_parents.png" />
</span>.</p></div>
<div class="para"><p>Tout comme l'arborescence du NCBI, on aperçoit le nombre de taxons qui composent l'arbre (<em>zone entourée en noir</em>), avec en plus, cette fois-ci, le nom de l'arbre.</p></div>
<div class="para"><p>L'étiquette <span class="image">
<img src="etiquette_show_hide_internal_nodes.png" alt="etiquette_show_hide_internal_nodes.png" />
</span> (<em>zone entourée en bleu</em>) permet simplement d'effacer de l'affichage les noeuds internes de l'arbre (<em>en <span style="color: #66f;"><strong>bleu clair</strong></span></em>) pour offrir à l'utilisateur la vision de la structure de son arbre (dépourvu des parents communs).</p></div>
<div class="para"><p>En ce qui concerne les requêtes, leur principe de fonctionnement reste inchangé, si ce n'est que les arbres affichés et navigables ne seront uniquement ceux qui répondent à la requête.</p></div>
<div class="para"><p>On peut aussi, à partir de cette étape, télécharger la collection d'arbres (qui a été modifiée ou non).</p></div>
<div class="para"><p>Il est également possible ici d'obtenir la version sous forme de graphe de son arbre en cliquant sur <span style="color: green;">Click to visualize this tree as graph</span>.</p></div>
</div>
<h2 id="_module_phylowidget">4. Module phyloWidget</h2>
<div class="sectionbody">
<h3 id="_qu_est_ce_que_c_est">4.1. Qu'est ce que c'est?</h3><div style="clear:left"></div>
<div class="para"><p>PhyloWidget est une applet Java libre de droits, servant à visionner et éditer des arbres phylogénétiques en ligne. C'est un outil simple à utiliser et très complet, permettant une grande interaction avec l'utilisateur.
Il est possible de créer son arbre, l'importer via les formats Newick ou Nexus, et même de le modifier afin de l'exporter sous forme de fichier ou d'image.
Entre autres, on note des suppléments d'ergonomie agréables comme les différents types de visualisation (circulaire, rectangulaire, &#8230;), le zoom, la recherche de taxons, ou encore l'affichage des vraies longueurs de branches. A cela vient s'ajouter sur le survol d'un taxon, un tableau d'informations ainsi qu'un large éventail d'interactions (à découvrir).</p></div>
<div class="para"><p>Cette application requiert l'environnement java 1.5 coté client.
Sa réalisation est dûe à Gregory Jordanie (<a href="mailto:phylowidget@gmail.com"><tt>phylowidget@gmail.com</tt></a>) sous la tutelle de Bill Piel (Google Summer of Code project).</p></div>
<h3 id="_int_gration_du_module">4.2. Intégration du module</h3><div style="clear:left"></div>
<div class="para"><p>Ce module a été rajouté afin de compléter la visualisation personnalisable des arbres dans notre application.
Pour ce faire, nous faisons appel à l'applet directement du site source en passant l'arbre à visualiser en paramètre. Ainsi le serveur hébergeant PhyloExplorer n'est pas sollicité.</p></div>
<div class="para"><p>PhyloWidget est la meilleure solution libre en terme d'utilisation et
d'installation (parmis d'autres solutions comme ATV ou Clustalw).</p></div>
</div>
<h1 id="_bilan">Bilan</h1>
<div class="para"><p>Notre principale préoccupation a été de fournir les fonctionnalités
demandées dans les délais impartis. De fréquentes interactions (réunions,
emails) avec le client nous ont permis de définir plus précisément
ses besoins. Ainsi, les cinq objectifs suivants ont été livrés
avec succès :</p></div>
<div class="ilist"><ul>
<li>
<p>
pouvoir afficher l'arbre avec les noeuds internes (liste des parents
  intermédiaires aux parents communs entre chaque noeud),
</p>
</li>
<li>
<p>
avoir accès aux informations d'un taxon via un lien vers le site du NCBI
</p>
</li>
<li>
<p>
établir des statistiques sur la collection et les afficher,
</p>
</li>
<li>
<p>
afficher des propositions lors de saisie erronée de taxons
  (<em>Do you mean?</em>),
</p>
</li>
<li>
<p>
filtrer les arbres (la collection) pour ne pouvoir garder que ce qui
  intéressse l'utilisateur.
</p>
</li>
</ul></div>
<div class="para"><p>Nous avons dépassé ces objectifs de ce TER en proposant avec l'accord
de l'utilisateur :</p></div>
<div class="ilist"><ul>
<li>
<p>
la correction à la volée les taxons erronés et/ou ambigus
  (directement dans la collection),
</p>
</li>
<li>
<p>
l'affichage des images des taxons survolés pour offrir à l'utilisateur
  une perception visuelle des noms qu'il étudie dans ses arbres,
</p>
</li>
<li>
<p>
un affichage de la liste des taxons représentant un noeud interne,
</p>
</li>
<li>
<p>
un accès à la liste des arbres contenant un noeud de l'arbre NCBI,
</p>
</li>
<li>
<p>
le téléchargement de l'arborescence du NCBI restreinte aux taxons fournis
  par l'utilisateur,
</p>
</li>
<li>
<p>
le téléchargement des collections filtrées et modifiées par
  l'utilisateur,
</p>
</li>
<li>
<p>
la visualisation et la manipulation des arbres sous forme de
  graphe (PhyloWidget).
</p>
</li>
</ul></div>
<div class="para"><p>Toutes ces fonctionnalités s'inscrivent dans une interface conviviale,
simple et intuitive.</p></div>
<h1 id="_annexe">Annexe</h1>
<h2 id="_glossaire_phylog_n_tique">1. Glossaire phylogénétique</h2>
<div class="sectionbody">
<div class="para"><p><strong>Arbre phylogénétique</strong> : l'équivalent d'un arbre généalogique de taxons.</p></div>
<div class="para"><p><strong>Phylogénie</strong> : étude de la formation et de l'évolution des organismes vivants afin d'établir leur parenté.</p></div>
<div class="para"><p><strong>Taxon</strong> : les organismes du vivant sont classés selon des catégories en fonction de leurs similitudes et de leurs relations évolutives. Ces catégories sont des taxons et représentent les noeuds d'un arbre phylogénétique.</p></div>
</div>
<h2 id="_glossaire_technique">2. Glossaire technique</h2>
<div class="sectionbody">
<div class="para"><p><strong>CSS</strong> : feuille de style, dans notre cas externe, décrivant le style des balises d'une page HTML la référençant. Elle personnalise l'aspect visuel des pages à l'aide des indices <em>id</em>, <em>name</em>, <em>class</em>.</p></div>
<div class="para"><p><strong>CSV</strong> : <em>Comma Separated Values</em>, valeurs séparées par des virgules ou  un séparateur défini. C'est un type de banque de données.</p></div>
<div class="para"><p><strong>Filtrage</strong> : permet dans le cas présent de restreindre un arbre en sous arbres.</p></div>
<div class="para"><p><strong>JQuery</strong> : bibliothèque Javascript qui porte sur l'interaction entre JavaScript et HTML. La librairie se présente comme un unique fichier décrivant les utilisations <em>d'évènements multi navigateur</em>, <em>DOM</em>, <em>Effets et animations</em>, et surtout <em>Ajax</em>.</p></div>
<div class="para"><p><strong>NCBI</strong> : National Center for Biotechnology Information, référence en matière de biotechnologie, <a href="http://www.ncbi.nlm.nih.gov"><tt>http://www.ncbi.nlm.nih.gov</tt></a>.</p></div>
<div class="para"><p><strong>Nexus</strong> : format de fichier contenant des arbres <em>phylogénétiques</em> et des annotations associées.</p></div>
<div class="para"><p><strong>Newick</strong> : format de fichier contenant des arbres <em>phylogénétiques</em>.</p></div>
<div class="para"><p><strong>Phylip</strong> : format de représentation d'arbres <em>phylogénétiques</em> sous forme de <em>(syntaxe parenthésée);</em>.</p></div>
<div class="para"><p><strong>Python</strong> : langage de programmation interprété, multi-paradigme, qui favorise la programmation impérative structurée et orientée objet. Il est doté d'un typage dynamique fort, d'une gestion automatique de la mémoire par ramasse-miettes et d'un système de gestion d'exceptions. Sous licence libre et multi plate-formes.</p></div>
<div class="para"><p><strong>SVN / Subversion</strong> : entrepôt de versions temporaires de code qui permet aux développeurs de tester, partager, modifier, comparer, réinstaller un projet en équipe.</p></div>
<div class="para"><p><strong>Template</strong> : modèle permettant de construire les pages d'un site web selon une trame générale (un squelette) et des zones modifiables. Utile pour les mises à jour et modifications en cascade.</p></div>
</div>
<h2 id="_liens_externes">3. Liens externes</h2>
<div class="sectionbody">
<div class="para"><p><strong>Python</strong> : <a href="http://www.python.org"><tt>http://www.python.org</tt></a></p></div>
<div class="para"><p><strong>NetworkX</strong> : <a href="https://networkx.lanl.gov/wiki"><tt>https://networkx.lanl.gov/wiki</tt></a></p></div>
<div class="para"><p><strong>CherryPy</strong> : <a href="http://www.cherrypy.org/"><tt>http://www.cherrypy.org/</tt></a></p></div>
<div class="para"><p><strong>BioPython</strong> : <a href="http://biopython.org/wiki/Main_Page"><tt>http://biopython.org/wiki/Main_Page</tt></a></p></div>
<div class="para"><p><strong>NCBI</strong> : <a href="http://www.ncbi.nlm.nih.gov/"><tt>http://www.ncbi.nlm.nih.gov/</tt></a></p></div>
<div class="para"><p><strong>Référence biologique</strong> : <a href="http://fr.wikipedia.org"><tt>http://fr.wikipedia.org</tt></a></p></div>
<div class="para"><p><strong>Applet PhyloWidget</strong> : <a href="http://www.phylowidget.org"><tt>http://www.phylowidget.org</tt></a></p></div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2008-04-04 12:37:21 CEST
</div>
</div>
</body>
</html>
